package ru.ipo.dces.plugins.sampleplugin;

import ru.ipo.dces.exceptions.GeneralRequestFailureException;
import ru.ipo.dces.pluginapi.Plugin;
import ru.ipo.dces.pluginapi.PluginEnvironment;
import ru.ipo.dces.utils.ResultUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created by IntelliJ IDEA.
 * User: ilya
 * Date: 12.04.11
 * Time: 14:34
 * <p/>
 * <p>Класс плагина должен реализовывать интерфейс {@link Plugin}. Кроме того, в этом примере
 * плагин расширяет {@link JPanel}, но это делать необязательно</p>
 * <p/>
 */
public class SamplePlugin extends JPanel implements Plugin, ActionListener {

    //Заводим поле, в котором хранится окружение плагина. Через это окружение плагин общается с системой.
    private PluginEnvironment env;

    private JColorChooser colorChooser; //Компонент для выбора цвета

    //Плагин обязан иметь конструктор от PluginEnvironment
    public SamplePlugin(PluginEnvironment env) {
        this.env = env;
        initInterface();
    }

    private void initInterface() {
        setLayout(new BorderLayout());

        JButton submit = new JButton("Отправить решение");
        submit.addActionListener(this);

        colorChooser = new JColorChooser();

        add(submit, BorderLayout.SOUTH);
        add(colorChooser, BorderLayout.CENTER);
        add(env.getStatementPanel(), BorderLayout.NORTH);
    }

    //преобразуем цвет в строку для передачи по сети
    private String colorToString(Color c) {
        return Integer.toHexString(c.getRGB() & 0x00FFFFFF); //remove alpha channel information
    }

    //преобразуем строку в цвет для чтения правильного ответа
    private Color stringToColor(String s) {
        return new Color(Integer.parseInt(s, 16));
    }

    //следующие три метода реализуют интерфейс Plugin

    public JPanel getPanel() {
        //необходимо вернуть окно, на котором отображается плагин.
        //Возвращаем окно, которым является как раз текущий объект
        return this;
    }

    public void activate() {
        //вызывается при выборе задачи. Ничего не будем делать, только напишем отладочный вывод:
        System.out.println("Plugin activated");
    }

    public void deactivate() {
        //вызывается если участник выбрал другую задачу. Ничего не будем делать, только напишем отладочный вывод:
        System.out.println("Plugin deactivated");
    }

    //реализаиция интерфейса ActionListener

    public void actionPerformed(ActionEvent e) {
        //Срабатывает при нажатии на кнопку

        //убедиться, что участник действительно собирается отправить решение.
        if (JOptionPane.showConfirmDialog(
                this,
                "Вы уверены, что хотите отправить решение?",
                "Отправка решения",
                JOptionPane.YES_NO_OPTION
        ) != JOptionPane.YES_OPTION)
            return;

        //проверим ответ участника
        Color userAnswer = colorChooser.getColor();
        Color rightAnswer = stringToColor(
                env.getProblem().getString("right color") //добываем строку из задачи
        );

        int delta =
                Math.abs(userAnswer.getRed() - rightAnswer.getRed()) +
                        Math.abs(userAnswer.getRed() - rightAnswer.getRed()) +
                        Math.abs(userAnswer.getRed() - rightAnswer.getRed());

        //Ответ участника должен отличаться от правильного ответа не более чем на, например, 100:
        int RIGHT_ANSWER_MAX_DELTA = 100;
        boolean userIsRight = delta < RIGHT_ANSWER_MAX_DELTA;

        try {
            env.submitSolution(
                    //пользуемся утилитной функцией для создания HashMap:
                    // "color" -> введенный цвет, "result" -> результат сравнения ответа с правильным
                    ResultUtils.newMap(
                            "color", //цвет пользователя
                            colorToString(userAnswer),

                            "answer", //ответ, посланный пользователем. Для демонстрационных целей используется answer вместо accepted
                            userIsRight ? "1" : "0"
                    )
            );
            JOptionPane.showMessageDialog(this, "Решение отослано");
        } catch (GeneralRequestFailureException e1) {
            JOptionPane.showMessageDialog(this, "Не удалось отправить решение");
        }
    }
}
